#pragma once
#include <QGraphicsItem>
#include <QPainter>
#include <QRectF>
#include <QString>
#include <QList>

// 前向声明
class BasePort;
enum class PortType;

class BaseNode : public QGraphicsItem
{
    // 注意：QGraphicsItem 不是 QObject 的子类，所以不能使用 Q_OBJECT 宏
    // 如果需要信号槽机制，可以考虑继承 QObject 并使用多重继承

public:
    explicit BaseNode();
    virtual ~BaseNode();

    // QGraphicsItem 必须实现的方法
    QRectF boundingRect() const override;
    void paint(QPainter *painter, const QStyleOptionGraphicsItem *option, QWidget *widget) override;
    
    // 当节点被添加到场景时调用
    QVariant itemChange(GraphicsItemChange change, const QVariant &value) override;

    // 模板方法模式 - 定义节点执行的骨架
    void executeNode();

    // 策略模式 - 子类必须实现的策略方法
    virtual void processLogic() = 0;           // 纯虚函数：处理节点逻辑
    virtual QString getNodeType() const = 0;   // 纯虚函数：获取节点类型名称
    virtual QColor getNodeColor() const = 0;   // 纯虚函数：获取节点颜色

    // 端口管理
    BasePort* addPort(PortType type, const QString& dataType = "variant");
    QList<BasePort*> getInputPorts() const;
    QList<BasePort*> getOutputPorts() const;
    void removePort(BasePort* port);
    
    // 确保端口添加到场景
    void ensurePortsInScene();
    
    // 更新端口位置
    void updatePortPositions();

protected:
    // 模板方法的具体步骤
    virtual void preProcess();    // 处理前的准备工作
    virtual void postProcess();   // 处理后的清理工作

    // 通用属性
    qreal m_width;
    qreal m_height;
    QString m_nodeName;
    
    // 端口管理
    QList<BasePort*> m_inputPorts;
    QList<BasePort*> m_outputPorts;
    
private:
    bool m_portsAddedToScene;
};